#!/usr/bin/python3
# -*- coding:utf-8 -*-
""""
   @Author: 即将拥有人鱼线的yjw
   @Time: 2024/12/17 15:41
   @File: compareZip.py
   @desc:
"""
import zipfile
import hashlib
from pathlib import Path


def calculate_file_hash(zip_ref, file_name, hash_algorithm='md5'):
    """计算 ZIP 文件中指定文件的哈希值"""
    hash_obj = hashlib.new(hash_algorithm)
    with zip_ref.open(file_name) as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_obj.update(chunk)
    return hash_obj.hexdigest()


def get_zip_file_info(zip_path):
    """提取 ZIP 文件中的所有文件路径及其哈希值"""
    file_info = {}
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:
        for member in zip_ref.filelist:
            if not member.is_dir():
                file_name = member.filename
                file_hash = calculate_file_hash(zip_ref, file_name)
                file_info[file_name] = file_hash
    return file_info


def compare_zip_files(zip_a, zip_b):
    """比较两个 ZIP 文件，检查 A 包中的所有文件是否都在 B 包中且内容相同"""
    files_in_a = get_zip_file_info(zip_a)
    files_in_b = get_zip_file_info(zip_b)

    # 检查 A 包中的每个文件是否都在 B 包中并且内容相同
    missing_different_files = []
    different_files = []
    for file_name, file_hash in files_in_a.items():
        # if file_name not in files_in_b or files_in_b[file_name] != file_hash:
        if file_name not in files_in_b:
            missing_different_files.append(f'{file_name}  ==文件缺失')
        elif files_in_b[file_name] != file_hash:
            different_files.append(f'{file_name} ==内容不一样')
    # 如果有缺失或不同的文件，则返回 False
    diff_result = list()
    if missing_different_files or different_files:
        print(f"以下文件存在问题 (文件缺失或者内容不一样):")
        if missing_different_files:
            diff_result.append(f"以下文件存在问题 (文件缺失):")
            for file in sorted(missing_different_files):
                print(f"  - {file}")
                diff_result.append(f"- {file}")
        if different_files:
            diff_result.append(f"以下文件存在问题 (文件内容不一样):")
            for file in sorted(different_files):
                print(f"  - {file}")
                diff_result.append(f"- {file}")
        return diff_result
    else:
        # diff_result.append("A 包中的所有文件都存在于 B 包中且内容相同")
        print("A 包中的所有文件都存在于 B 包中且内容相同")
        return diff_result


if __name__ == "__main__":
    # 替换为你的 ZIP 文件路径
    zip_a_path = r"C:\Users\yejw46507\Downloads\AML5.0-amlcom-server-V202501-03-000.zip"
    zip_b_path = r"C:\Users\yejw46507\Downloads\AML5.0-amlcom-server-V202501-05-000.zip"

    result = compare_zip_files(zip_a_path, zip_b_path)
    print(result)